package com.zj.common;

import lombok.Data;

/**
 * @author zhangbo
 * @program: PDF-helper
 * @ClassName ResultVo
 * @description: $
 * @date 2023-05-22 22:43:31
 */
@Data
public class ResultVo<T> {

    private Integer code;

    private String msg;

    private T data;


    /**
     * 返回成功
     *
     * @param <T> 类型
     * @return 结果
     */
    public static <T> ResultVo<T> success() {
        return ResultVo.success(null);
    }


    /**
     * 返回带结果的成功数据
     *
     * @param data 成功数据
     * @param <T>  类型
     * @return 结果
     */
    public static <T> ResultVo<T> success(T data) {
        return helper(ResultEnum.SUCCESS, data);
    }

    /**
     * 警告
     *
     * @param code 状态码
     * @param msg  描述信息
     * @param data 数据
     * @param <T>  类型
     * @return 结果
     */
    public static <T> ResultVo<T> warning(Integer code, String msg, T data) {
        return helper(code, msg, data);
    }

    /**
     * 警告
     *
     * @param resultEnum 状态枚举
     * @param data       数据
     * @param <T>        类型
     * @return 结果
     */
    public static <T> ResultVo<T> warning(ResultEnum resultEnum, T data) {
        return helper(resultEnum, data);
    }


    /**
     * 返回错误
     *
     * @param msg 描述信息
     * @param <T> 类型
     * @return 结果
     */
    public static <T> ResultVo<T> error(String msg) {
        return helper(ResultEnum.ERROR.getCode(), msg, null);
    }

    /**
     * 错误
     *
     * @param code 状态码
     * @param msg  描述信息
     * @param <T>  类型
     * @return 结果
     */
    public static <T> ResultVo<T> error(Integer code, String msg) {
        return helper(code, msg, null);
    }

    /**
     * 错误返回
     *
     * @param re  枚举
     * @param <T> 类型
     * @return 结果
     */
    public static <T> ResultVo<T> error(ResultEnum re) {
        return error(re, null);
    }

    /**
     * 错误返回
     *
     * @param re   结果枚举
     * @param data 数据
     * @param <T>  类型
     * @return 结果
     */
    public static <T> ResultVo<T> error(ResultEnum re, T data) {
        return helper(re, data);
    }


    /**
     * 返回帮助方法
     *
     * @param resultEnum 结果枚举
     * @param data       数据
     * @param <T>        数据类型
     * @return 结果
     */
    private static <T> ResultVo<T> helper(ResultEnum resultEnum, T data) {
        ResultVo<T> resultVo = new ResultVo<>();
        resultVo.setCode(resultEnum.getCode());
        resultVo.setMsg(resultEnum.getMsg());
        resultVo.setData(data);

        return resultVo;
    }


    /**
     * 返回帮助方法
     *
     * @param code 状态码
     * @param msg  描述信息
     * @param data 数据
     * @param <T>  类型
     * @return 结果
     */
    private static <T> ResultVo<T> helper(Integer code, String msg, T data) {
        ResultVo<T> resultVo = new ResultVo<>();
        resultVo.setCode(code);
        resultVo.setMsg(msg);
        resultVo.setData(data);

        return resultVo;
    }

}
